home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 398 / 398.xpi / chrome / forecastfox.jar / content / options / labels.js next >
Text File  |  2010-02-04  |  12KB  |  371 lines

  1. /*------------------------------------------------------------------------------
  2.   Copyright (c) 2008 Ensolis, LLC. All Rights Reserved.
  3.   ----------------------------------------------------------------------------*/
  4.  
  5. var gLabels = null;
  6.  
  7. function labelsLoad()
  8. {
  9.   gLabels = new LabelsModule();
  10.   gLabels.start();
  11. }
  12.  
  13. function labelsUnload()
  14. {
  15.   gLabels.stop();
  16.   gLabels = null;
  17. }
  18.  
  19. function LabelsModule() {}
  20. LabelsModule.prototype = {
  21.   _manager: null,
  22.   _clipboard: null,  
  23.   _bundle: null,
  24.   _types: null,
  25.   _defaults: null,
  26.   _rows: null,
  27.   _sortId: null,
  28.   _sortDirection: null,
  29.   _naturalOrder: null,
  30.   _columns: new Array("ff-col-variable", "ff-col-description", "ff-col-value"),
  31.   
  32.   start: function LabelsModule_start()
  33.   {
  34.     //setup variables
  35.     this._manager = Components.classes["@ensolis.com/forecastfox/manager-service;1"].getService(Components.interfaces.ffIManagerService);
  36.     this._clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
  37.     this._bundle = document.getElementById("ff-bundle-labels");
  38.                                            
  39.     //get type
  40.     this._types = window.arguments[0];
  41.     
  42.     //get defaults
  43.     this._defaults = new Object();
  44.     var pbs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  45.     var branch = pbs.getDefaultBranch("forecastfox.");
  46.     for (var i=0; i< this._types.length; i++)
  47.       this._defaults[this._types[i]] = this._bundle.getString(eval("'forecastfox." + this._types[i] + "'"));
  48.   
  49.     //set title
  50.     var last = this._types[0].lastIndexOf(".");
  51.     var title = this._bundle.getString(eval("'ff.labels." + this._types[0].substring(0,last) + "'"));
  52.     document.getElementById("ff-labels-header").title = title;
  53.     
  54.     //set display
  55.     this._rows = new Array();
  56.     if (this._types.length > 1) {
  57.       this._rows.push(document.getElementById("ff-box-title"));    
  58.       this._rows.push(document.getElementById("ff-box-label"));
  59.     } else {
  60.       this._rows.push(document.getElementById("ff-box-label"));
  61.     }
  62.        
  63.     for (i=0; i< this._rows.length; i++) {
  64.       this._rows[i].removeAttribute("hidden");
  65.       var textbox = this._rows[i].getElementsByTagName("textbox")[0];
  66.       var button = this._rows[i].getElementsByTagName("button")[0];
  67.       textbox.value = this._getUTFOption(this._types[i]);
  68.       
  69.       if (i == this._rows.length -1) {
  70.         textbox.focus();
  71.         textbox.select();   
  72.       }
  73.       
  74.       branch = getBranch(false, null);
  75.       if (branch.prefHasUserValue(this._types[i]))
  76.         button.removeAttribute("disabled"); 
  77.     }
  78.                                 
  79.     //setup tree and buttons      
  80.     this._populateTree();
  81.     this.updateButtons();
  82.     
  83.     // disable the apply button
  84.     document.getElementById("apply").setAttribute("disabled", true);              
  85.   },
  86.   
  87.   stop: function LabelsModule_stop()
  88.   {
  89.     this._manager = null;
  90.     this._clipboard = null;    
  91.     this._bundle = null;
  92.     this._types = null;
  93.     this._defaults = null;
  94.     this._rows = null;
  95.     this._sortId = null;
  96.     this._sortDirection = null;
  97.     this._naturalOrder = null;
  98.     this._columns = null;
  99.   },
  100.     
  101.   restoreDefault: function LabelsModule_restoreDefault(aType)
  102.   {
  103.     for (var i=0; i<this._types.length; i++) {
  104.       if (this._rows[i].hasAttribute("hidden"))
  105.         continue;
  106.       if (this._types[i].indexOf(aType) != -1) {
  107.         var textbox = this._rows[i].getElementsByTagName("textbox")[0];
  108.         textbox.value = this._defaults[this._types[i]];
  109.       }
  110.     }
  111.  
  112.     this.updateButtons();  
  113.   },
  114.     
  115.   copy: function LabelsModule_copy(aType)
  116.   {
  117.     var tree = document.getElementById("ff-tree-vars");  
  118.     if (tree.currentIndex == -1)
  119.       return;
  120.  
  121.     var item = tree.contentView.getItemAtIndex(tree.currentIndex);
  122.     var cells = item.getElementsByTagName("treecell");
  123.     var copy_string;
  124.  
  125.     switch (aType) {
  126.       case "variable" :
  127.         copy_string = cells[0].getAttribute("label");
  128.         break;
  129.       case "description" :
  130.         copy_string = cells[1].getAttribute("label");
  131.         break;
  132.     }
  133.  
  134.     this._clipboard.copyString(copy_string);  
  135.   },
  136.   
  137.   updateButtons: function LabelsModule_updateButtons(aEvent)
  138.   {
  139.     if (aEvent) {
  140.       // don't enable the apply button for button presses
  141.       if (aEvent.explicitOriginalTarget.localName != "textbox")
  142.         return;
  143.     }
  144.     
  145.     //enable apply
  146.     document.getElementById("apply").removeAttribute("disabled");
  147.     
  148.     //set restore buttons
  149.     for (var i=0; i<this._types.length; i++) {
  150.       var textbox = this._rows[i].getElementsByTagName("textbox")[0];
  151.       var button = this._rows[i].getElementsByTagName("button")[0];
  152.       if (textbox.value != this._defaults[this._types[i]])
  153.         button.removeAttribute("disabled");           
  154.       else
  155.         button.setAttribute("disabled", "true");
  156.     }     
  157.   },
  158.     
  159.   accept: function LabelsModule_accept(aClose)
  160.   {
  161.     //set values
  162.     var branch = getBranch(false, null);
  163.     for (var i=0; i<this._types.length; i++) {
  164.       var textbox = this._rows[i].getElementsByTagName("textbox")[0];
  165.       if (textbox.value == this._defaults[this._types[i]] &&
  166.           branch.prefHasUserValue(this._types[i]))
  167.         branch.clearUserPref(this._types[i]);
  168.       else
  169.         this._setUTFOption(this._types[i], textbox.value);
  170.     }    
  171.     
  172.     //close
  173.     if (aClose)  
  174.       window.close();
  175.     else
  176.       document.getElementById("apply").setAttribute("disabled", "true");  
  177.   },
  178.     
  179.   setSort: function LabelsModule_setSort(aType)
  180.   {
  181.     var sortId = "ff-col-"+aType;
  182.     var column = document.getElementById(sortId);
  183.     var direction = column.getAttribute("sortDirection");
  184.     
  185.     // set the sort according to the current sort direction on the column
  186.     if (direction == "ascending")
  187.       this._setSort(aType, "descending");
  188.     else if (direction == "descending")
  189.       this._setSort(aType, "natural");
  190.     else
  191.       this._setSort(aType, "ascending");
  192.   },
  193.   
  194.   _setSort: function LabelsModule__setSort(aType, aDirection)
  195.   {
  196.     // set the internal sort id and direction
  197.     this._sortId = "ff-col-"+aType;
  198.     this._sortDirection = aDirection;
  199.     
  200.     var columns = document.getElementById("ff-tree-columns");
  201.     columns = columns.getElementsByTagName("treecol");
  202.     
  203.     // update the sort attributes
  204.     for (var x = 0; x < columns.length; x++) {
  205.       if (columns[x].getAttribute("id") == this._sortId)
  206.         columns[x].setAttribute("sortDirection", aDirection);
  207.       else
  208.         columns[x].removeAttribute("sortDirection");
  209.     }
  210.     
  211.     // sort the columns
  212.     this._sort();
  213.   },
  214.   
  215.   _sort: function LabelsModule__sort()
  216.   {
  217.     // return if there is no sorting
  218.     if (!this._sortId || !this._sortDirection) return;
  219.     
  220.     var results = document.getElementById("ff-tree-items");
  221.     var rows = new Array();
  222.     
  223.     // get the list of rows
  224.     while (results.hasChildNodes()) {
  225.       var result = results.removeChild(results.firstChild);
  226.       if (result.nodeName == "treeitem")
  227.         rows.push(result);
  228.     }
  229.     
  230.     // perform the sort based on the direction
  231.     if (this._sortDirection == "ascending")
  232.       rows.sort(sortAscending);
  233.     else if (this._sortDirection == "descending")
  234.       rows.sort(sortDescending);
  235.     else
  236.       rows = this._naturalOrder;
  237.     
  238.     // then re-insert the rows
  239.     for (var x = 0; x < rows.length; x++)
  240.       results.appendChild(rows[x]);
  241.   },
  242.   
  243.   _getUTFOption: function LabelsModule__getUTFOption(aOption)
  244.   {
  245.     return getPref(aOption);  
  246.   },
  247.   
  248.   _setUTFOption: function LabelsModule__setUTFOption(aOption, aValue)
  249.   {
  250.     setPref(aOption, aValue);
  251.   },
  252.   
  253.   _populateTree: function LabelsModule__populateTree()
  254.   {   
  255.     var tree = document.getElementById("ff-tree-items");
  256.     var tooltip, type;
  257.             
  258.     //clear old tree data
  259.     while (tree.hasChildNodes())
  260.       tree.removeChild(tree.lastChild);
  261.     
  262.     this._naturalOrder = new Array();
  263.     
  264.     //populate current values
  265.     type = this._types[0].substring(0, this._types[0].indexOf("."));
  266.     tooltip = (this._types[0].indexOf("tooltip") != -1);
  267.     switch (type) {
  268.       case "dayt":
  269.         this._setTreeData(tree, "days", 0, tooltip);
  270.         break;        
  271.       case "dayf":
  272.         this._setTreeData(tree, "days", 1, tooltip);
  273.         break;
  274.       case "swa":
  275.         this._setTreeData(tree, "swa", 0, tooltip);
  276.         break;
  277.       case "radar":
  278.         this._setTreeData(tree, "radar", 0, tooltip);
  279.         break;  
  280.       case "cc":
  281.       default:
  282.         this._setTreeData(tree, "current", 0, tooltip);
  283.         break;
  284.     }         
  285.   },
  286.  
  287.   _setTreeData: function LabelsModule__setTreeData(aTree, aName, aIndex, aTooltip) {
  288.     var data;
  289.     var items = this._manager.parser.getItems(aName, aIndex, {});
  290.     
  291.     for (var j=0; j<items.length; j++) {
  292.       var item = items[j];
  293.       if (!aTooltip && (item.name == "nl"))
  294.         continue;
  295.       data = new Array(3);
  296.       data[0] = "[" + item.name + "]";    
  297.       data[1] = item.getProperty("description");
  298.       data[2] = this._manager.parser.getValue(aName, aIndex, item.name, null);     
  299.       var treeitem = this._addTreeRow(aTree, data, true);  
  300.       
  301.       //get the conversions  
  302.       if (item.hasProperty("conversion")) {
  303.         var converters = this._manager.converters.getItems(
  304.                                   item.getProperty("conversion"), {});
  305.         if (converters.length == 0)
  306.           continue;                          
  307.         var child = document.createElement("treechildren");
  308.         for (var k=0; k<converters.length; k++) {
  309.           var converter = converters[k];
  310.           data = new Array(3);
  311.           data[0] = "[" + item.name + "+" + converter.name + "]";    
  312.           data[1] = item.getProperty("description") + " - " + 
  313.                     converter.getProperty("description");
  314.           data[2] = this._manager.parser.getValue(aName, aIndex, item.name, 
  315.                                                   converter.name);  
  316.           this._addTreeRow(child, data, false);                                         
  317.         }
  318.         treeitem.setAttribute("container", "true");
  319.         treeitem.appendChild(child);                                    
  320.       }                                 
  321.     }
  322.   },
  323.   
  324.   _addTreeRow: function LabelsModule__addTreeRow(aParent, aData, aStore) 
  325.   {
  326.     var item = document.createElement("treeitem");
  327.     var node = document.createElement("treerow");
  328.     var cell;
  329.  
  330.     for (var i=0; i<aData.length; i++) {
  331.  
  332.       cell = document.createElement("treecell");
  333.       cell.setAttribute("label", aData[i]);
  334.       cell.setAttribute("ref", this._columns[i]);
  335.  
  336.       // And add it onto the row.
  337.       node.appendChild(cell);
  338.     }
  339.  
  340.     // When done add the node onto the item, then the item onto the aParent.
  341.     item.appendChild(node);
  342.     aParent.appendChild(item);
  343.     if (aStore)
  344.       this._naturalOrder.push(item);
  345.     return item;
  346.   }
  347. };
  348.  
  349. function sortDescending(aItem1, aItem2) {
  350.   var label1 = getCellForId(aItem1).getAttribute("label");
  351.   var label2 = getCellForId(aItem2).getAttribute("label");
  352.   if (label1 > label2)
  353.     return -1;
  354.   else if (label1 == label2)
  355.     return 0;
  356.   else
  357.     return 1;
  358. }
  359.  
  360. function sortAscending(aItem1, aItem2) {
  361.   return sortDescending(aItem1, aItem2) * -1;
  362. }
  363.   
  364. function getCellForId(aTreeitem) {
  365.   var cells = aTreeitem.getElementsByTagName("treecell");
  366.   for (var x = 0; x < cells.length; x++) {
  367.     if (cells[x].getAttribute("ref") == gLabels._sortId)
  368.       return cells[x];
  369.   }
  370.   return null;
  371. }